home *** CD-ROM | disk | FTP | other *** search
/ Mac-Source 1994 July / Mac-Source_July_1994.iso / C and C++ / Graphics⁄Sound / Macintosh Tracker Folder / Tracker Server Folder / notes.c < prev    next >
Text File  |  1993-05-18  |  2KB  |  113 lines

  1. /* notes.c */
  2.  
  3. /* $Id: notes.c,v 3.3 1992/11/27 10:29:00 espie Exp espie $
  4.  * $Log: notes.c,v $
  5.  * Revision 3.3  1992/11/27  10:29:00  espie
  6.  * General cleanup
  7.  *
  8.  * Revision 3.2  1992/11/20  14:53:32  espie
  9.  * Added finetune.
  10.  *
  11.  * Revision 3.1  1992/11/19  20:44:47  espie
  12.  * Protracker commands.
  13.  *
  14.  * Revision 3.0  1992/11/18  16:08:05  espie
  15.  * New release.
  16.  *
  17.  */
  18.  
  19. #include <malloc.h>
  20. #include <stdio.h>
  21. #include <string.h>
  22. #include <ctype.h>
  23. #include <assert.h>
  24. #include <math.h>
  25.  
  26. #include "defs.h"
  27. #include "extern.h"
  28. #include "song.h"
  29. #include "channel.h"
  30.  
  31. LOCAL char *id = "$Id: notes.c,v 3.3 1992/11/27 10:29:00 espie Exp espie $";
  32.  
  33.  
  34. /* the musical notes correspond to some specific pitch.
  35.  * It's useful to be able to find them back, at least for
  36.  * arpeggii.
  37.  */
  38. int pitch_table[NUMBER_NOTES][NUMBER_FINETUNES];
  39. char note_name[NUMBER_NOTES][4];
  40.  
  41. char *note_template[12] = {"C-", "C#", "D-", "D#", "E-", "F-", "F#", "G-",
  42. "G#", "A-", "A#", "B-"};
  43.  
  44. /* find_note(pitch): find note corresponding to the stated pitch */
  45. int find_note(pitch)
  46. int pitch;
  47.     {
  48.     int a, b, i;
  49.     if (pitch == 0)
  50.         return -1;
  51.     a = 0;
  52.     b = NUMBER_NOTES-1;
  53.     while(b-a > 1)
  54.         {
  55.         i = (a+b)/2;
  56.         if (pitch_table[i][0] == pitch)
  57.             return i;
  58.         if (pitch_table[i][0] > pitch)
  59.             a = i;
  60.         else
  61.             b = i;
  62.         }
  63.     if (pitch_table[a][0] - FUZZ <= pitch)
  64.         return a;
  65.     if (pitch_table[b][0] + FUZZ >= pitch)
  66.         return b;
  67.     return NO_NOTE;
  68.     }
  69.  
  70. void create_notes_table()
  71.     {
  72.     double base, pitch;
  73.     int i, j, k;
  74.  
  75.     for (j = -8; j < 8; j++)
  76.         {
  77.         k = j < 0 ? j + 16 : j;
  78.         base = AMIGA_CLOCKFREQ/440.0/4.0 / pow(2.0, j/96.0);
  79.  
  80.         for (i = 0; i < NUMBER_NOTES; i++)
  81.             {
  82.             pitch = base / pow(2.0, i/12.0);
  83.             pitch_table[i][k] = floor(pitch + 0.5);
  84.             if (j == 0)
  85.                 {
  86.                 note_name[i][0] = note_template[(i+9)%12][0];
  87.                 note_name[i][1] = note_template[(i+9)%12][1];
  88.                 note_name[i][2] = '0'+ (i-3)/12;
  89.                 note_name[i][3] = '\0';
  90.                 }
  91.             }
  92.         }
  93.     }
  94.  
  95. int transpose_song(s, transpose)
  96. struct song *s;
  97. int transpose;
  98.     {
  99.     int oldt;
  100.     int i, j, n;
  101.  
  102.     if (!s)
  103.         return 0;
  104.     oldt = s->info.transpose;
  105.     for (n = 0; n < s->info.maxpat; n++)
  106.         for (i = 0; i < BLOCK_LENGTH; i++)
  107.             for (j = 0; j < NUMBER_TRACKS; j++)
  108.                 if (s->info.pblocks[n].e[j][i].note != NO_NOTE)
  109.                     s->info.pblocks[n].e[j][i].note += transpose - oldt;
  110.     s->info.transpose = transpose;
  111.     return oldt;
  112.     }
  113.